package ig.metrica.ui.modelo;

import ejb.metrica.matriz.correlacion.MatrizDTO;
import ig.util.excepciones.LogicaExcepcion;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Hashtable;
import java.util.Iterator;
import ig.util.ConexionServer;
import ig.util.ejb.IGBean;
import javax.ejb.FinderException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;

import ig.finanzas.MonedaPK;
import ig.finanzas.TasaPK;
import ig.finanzas.riesgo.FactorRiesgoMatrizCorrelacion;
import ig.finanzas.riesgo.FactorRiesgoPersonal;
import ig.metrica.origenesdedatos.OrigenDeDatos;
import ig.metrica.riesgo.FactorRiesgoPersonalMetrica;
//import ig.metrica.riesgo.MatrizCorrelacion;
//import ig.metrica.riesgo.MatrizCorrelacionHome;
import ig.metrica.riesgo.MatrizCorrelacionPK;
import ig.metrica.ui.PantallaSevinproPanel;
import ig.metrica.ui.ServiceLocator;
import ig.metrica.ui.modelo.modelotablas.ModeloTablaPAFM;
import ig.util.CellRenderSelectModel;
import ig.util.ejb.IGLlavePrimaria;
import ig.util.excepciones.DatoInvalidoExcepcion;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
import javax.naming.Context;

public class PantallaAsociacionFactoresMatriz extends PantallaSevinproPanel implements TableModelListener {
    
    private PantallaAsociacionFactorContrato pantalla=null;
    private FactorRiesgoMatrizCorrelacion frmc = null;
    //private Hashtable factorespersonales;
    
    private JComboBox comboMatricesPK;
    private JComboBox comboFactoresMatriz;
    private JTable tablaFactores;
    private JTable tablaMonedas;
    private WizzardModelo wizzard=null;
    private Hashtable relacionMonedasFactores;
//        private JlEstadoModeo dmodelo;

    private JComboBox[] comboBoxsColumns=new JComboBox[1];

    @Override
    public JComboBox[] getComboBoxsColumnsTable1() {
        return comboBoxsColumns;
    }

    private JComboBox[] comboBoxsColumnsTable2=new JComboBox[0];
    @Override
    public JComboBox[] getComboBoxsColumnsTable2() {
        return comboBoxsColumnsTable2;
    }

    public PantallaAsociacionFactoresMatriz(WizzardModelo wizzard,ThreadModelos threadModelos) throws NamingException, RemoteException, FinderException {
        this.threadModelos = threadModelos;
        this.pantalla = wizzard.asociacionfactores;
        this.wizzard=wizzard;
        JPanel panelCentral;
        JPanel panelsuperior;
        JTabbedPane pestanas;
        
        setLayout( new BorderLayout() );
        
        add( panelCentral = new JPanel() , BorderLayout.CENTER );
        panelCentral.setLayout( new GridBagLayout() );
        
        //-----------------------------------------------------------------------
        panelCentral.add( panelsuperior = new JPanel(), new GridBagConstraints(0, 0, 1, 1, 1, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,0), 0, 0));
        panelsuperior.setLayout(new FlowLayout(FlowLayout.CENTER));
        //-------------------------------------------------------------
        panelsuperior.add( new JLabel("Matriz de Correlaci\u00F3n   "));
        panelsuperior.add( comboMatricesPK = new JComboBox() );
        panelCentral.add( pestanas = new JTabbedPane(), new GridBagConstraints(0, 1, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0, 0) );
        pestanas.add("Factores", new JScrollPane(tablaFactores = new JTable(new ModeloTablaPAFM(new Hashtable()))));
        pestanas.add("Monedas", new JScrollPane(tablaMonedas = new JTable(new ModeloTablaPAFM(new Hashtable()))));
        //-------------------------------------------------------------------------------------
        
//        comboMatricesPK.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){comboMatricesActionPerformed(e);}});
        
        pantalla.suscribirEscucha(this);
        tablaFactores.getTableHeader().setReorderingAllowed(false);
        tablaMonedas.getTableHeader().setReorderingAllowed(false);

        tablaFactores.setComponentPopupMenu(EditarTabla);
        tablaMonedas.setComponentPopupMenu(EditarTabla);

        tablaMonedas.setDefaultRenderer(Object.class, new CellRenderSelectModel());
        tablaFactores.setDefaultRenderer(Object.class, new CellRenderSelectModel());
    }
    
    public String getTitulo() {
        return "Asociacion de Factores de la Matriz de Correlaci\u00F3n";
    }
    
    public void setModificable(boolean b) {
        comboMatricesPK.setEnabled(b);
        tablaFactores.setEnabled(b);
        tablaMonedas.setEnabled(b);
    }
    private OrigenDeDatos origenMonedasValores=null;
    Hashtable<String,Object> HTCombox= new  Hashtable<String,Object>();
    public void limpiarCampos() throws RemoteException, NamingException, FinderException, ClassNotFoundException, SQLException, DatoInvalidoExcepcion, ExceptionEnConsulta, Exception{
        relacionMonedasFactores = new Hashtable();
        //if(dmodelo!=null)dmodelo.setSalida("    Asociaci\u00F3n Factores Matriz");
        //----------------------------------------------------------------------------------------
        Collection resultados =this.lookupMatrizCorrelacionSBBean().findAll();
        Iterator i = resultados.iterator();
        while(i.hasNext()){
            MatrizDTO matriz = (MatrizDTO)i.next();
            if(this.wizzard.getModelo().getIdmatriz().equals(matriz.getId())){
                comboFactoresMatriz= new JComboBox();
                Hashtable ht=this.lookupMatrizCorrelacionSBBean().findById(matriz.getId());
                Iterator j = ((Collection)ht.get("FACTORES")).iterator();
                while(j.hasNext()){
                    FactorRiesgoMatrizCorrelacion factor = (FactorRiesgoMatrizCorrelacion)j.next();
                    if (frmc==null)
                        frmc = factor;
                    comboFactoresMatriz.addItem( factor );
                }
            }
            
            MatrizCorrelacionPK matrizPK = new MatrizCorrelacionPK( matriz.getNombre(), matriz.getFechaPublicacion() );
            comboMatricesPK.removeItem(matrizPK);
            matrizPK.setId(matriz.getId());
            matrizPK.setIdInterna( matriz.getId() );
            comboMatricesPK.addItem( matrizPK);
            if(idMatriz!=null && idMatriz==matrizPK.getIdInterna()){
                comboMatricesPK.setSelectedItem(matrizPK);
            }
        }
        
        comboMatricesPK.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){comboMatricesActionPerformed(e);}});
        
        //-------------------------------------------------------------------------
        try{
            relacionMonedasFactores = new Hashtable();
            ht.put("IDMODELO",this.threadModelos.getIdModelo());
            origenMonedasValores= ServiceLocator.getInstancia().getOrigenDatos( "MONEDASVALORES" );
            int mapeoMoneda = 0;//origenMonedasValores.getArregloCampos().indexOf( "NOMBRE MONEDA" );
            //+ " GROUP BY ("+ (mapeoMoneda+1) +") "
            ArrayList datos = origenMonedasValores.obtenerDatos( ht/*origenMonedasValores.getQuery() */);
            i = datos.iterator();
            while(i.hasNext()){
                Object[] registro = (Object[])i.next();
                MonedaPK monedaPK = new MonedaPK( registro[mapeoMoneda].toString().trim() );
                relacionMonedasFactores.put( monedaPK, new FactorRiesgoPersonalMetrica(frmc, null) );
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new ExceptionEnConsulta("Error tratando de Procesar los Valores Monedas.\n"+e);
        }
        setRelacionMonedasFactores(relacionMonedasFactores);
        
        //--------------------------------------------------------------------------
        
        TableColumn factor = tablaFactores.getColumnModel().getColumn(1);
        TableColumn monedaFactor = tablaMonedas.getColumnModel().getColumn(1);
        comboFactoresMatriz.setName("");
        factor.setCellEditor( new DefaultCellEditor(comboFactoresMatriz) );
        monedaFactor.setCellEditor( new DefaultCellEditor(comboFactoresMatriz) );
        comboFactoresMatriz.setName("ok");
        comboBoxsColumns[0]=comboFactoresMatriz;
        tableChanged(null);
    }
    
    public void tableChanged(TableModelEvent e){
        
        Hashtable relacionProductosFactores = pantalla.getRelacionProductosFactores();
        Hashtable relacionEspeciesFactores = pantalla.getRelacionEspeciesFactores();
        
        ArrayList factorestasasregistradas = new ArrayList();
        Hashtable factorespersonales = new Hashtable();
        
        ArrayList temp = new ArrayList();
        Iterator i = relacionProductosFactores.keySet().iterator();
        while (i.hasNext())
            temp.add( i.next() );
        
        i= relacionEspeciesFactores.keySet().iterator();
        while (i.hasNext())
            temp.add( i.next() );
        
        
        i = temp.iterator();
        while(i.hasNext()){
            IGLlavePrimaria llave = (IGLlavePrimaria)i.next();
            FactorRiesgoPersonal factor = (FactorRiesgoPersonal) relacionProductosFactores.get(llave);
            if (factor==null)
                factor = (FactorRiesgoPersonal) relacionEspeciesFactores.get(llave);
            
            if (factor.getTipo()==FactorRiesgoPersonal.TIPO_FACTORPRECIO)
                factorespersonales.put( llave, factor );
            else if (factor.getTipo()==FactorRiesgoPersonal.TIPO_FACTORTASA){
                TasaPK tasaPK = factor.getTasaPK();
                //////////verifica algo bien estraño sobre la adicion de nuevos tasasa a algo medio loco
                boolean adicionar=true;
                Enumeration iterator =factorespersonales.keys();
                while (iterator.hasMoreElements()){
                    Object obj= iterator.nextElement();
                    if(tasaPK.toString().trim().equals(obj.toString().trim()) && !(tasaPK.toString().equals(obj.toString())))
                        adicionar=false;
                }
                //////////
                if (!factorestasasregistradas.contains(tasaPK) && adicionar){
                    factorespersonales.put( tasaPK, factor );
                }
            }else{
                factorespersonales.put( llave, factor );
//                            System.out.println(this.getClass().getName()+" Es para TASA DE DESCUENTO.");
            }
        }
        ((ModeloTablaPAFM)tablaFactores.getModel()).setRelacionFactoresPantalla(pantalla.getRelacionEspeciesFactoresPantalla());
        ((ModeloTablaPAFM)tablaFactores.getModel()).setRelacionFactores(factorespersonales);
        tablaFactores.updateUI();
    }
    
    private void comboMatricesActionPerformed(ActionEvent e) {
        if(comboFactoresMatriz.getName()!=null && !comboFactoresMatriz.getName().equals(""))
            try {
                if(comboMatricesPK!=null && comboMatricesPK.getSelectedItem() !=null){
                    InitialContext ctx = ServiceLocator.getInstancia().getContexto();
//                    MatrizCorrelacionHome home = (MatrizCorrelacionHome)ctx.lookup("ig.metrica.riesgo.MatrizCorrelacion");
                    //System.out.println(comboMatricesPK.getSelectedItem());
                    Hashtable ht=this.lookupMatrizCorrelacionSBBean().findById(((MatrizCorrelacionPK) comboMatricesPK.getSelectedItem()).getId());
                    MatrizDTO matriz=(MatrizDTO) ht.get("DTO");
//                    MatrizCorrelacion matriz = home.findByPrimaryKey( (MatrizCorrelacionPK) comboMatricesPK.getSelectedItem() );
                    frmc=null;
                    this.idMatriz=(matriz.getId());
                    comboFactoresMatriz.removeAllItems();
                    
                    Collection c=null;
                    Iterator j =null;
                    try {
                        j = ((Collection)ht.get("FACTORES")).iterator();
                    } catch (java.util.NoSuchElementException ex) {
                        throw new java.util.NoSuchElementException("La matriz "+matriz.getNombre()+" no tiene factores asociados");
                    }
                    if(j==null || !j.hasNext())
                        throw new LogicaExcepcion("No se pudo cargar el factor de riego de la matriz.");
                    while(j.hasNext()){
                        FactorRiesgoMatrizCorrelacion factor = (FactorRiesgoMatrizCorrelacion)j.next();
                        if (frmc==null) frmc = factor;
                        comboFactoresMatriz.addItem( factor );
                    }
                    //asgina el prier
                    for (int i = 0; i < ((AbstractTableModel)tablaFactores.getModel()).getRowCount(); i++) {
                        try {
                            ((AbstractTableModel)tablaFactores.getModel()).setValueAt(frmc,i,1);
                        } catch (Exception ex) {}
                        
                        try {
                            ((AbstractTableModel)tablaMonedas.getModel()).setValueAt(frmc,i,1);
                        } catch (Exception ex) {}
                    }
                    Hashtable factorespersonales = getRelacionFactores();
                    Iterator i = factorespersonales.keySet().iterator();
                    while(i.hasNext()){
                        Object llave = i.next();
                        FactorRiesgoPersonal factor = (FactorRiesgoPersonal)factorespersonales.get(llave);
                        try {
                            factor.setFactorRiesgoMatrizCorrelacion( frmc );
                        } catch (DatoInvalidoExcepcion e2) {
                        }
                    }
                    
                    Hashtable relacionMonedasFactores = getRelacionMonedasFactores();
                    i = relacionMonedasFactores.keySet().iterator();
                    while(i.hasNext()){
                        Object llave = i.next();
                        FactorRiesgoPersonal factor = (FactorRiesgoPersonal)relacionMonedasFactores.get(llave);
                        try {
                            factor.setFactorRiesgoMatrizCorrelacion( frmc );
                        } catch (DatoInvalidoExcepcion e2) {
                        }
                        
                    }
                    tableChanged(null);
                    if(pantallaAsociacionFactoresContratos!=null)
                        this.pantallaAsociacionFactoresContratos.setValorPorDefecto(new TasaPK(frmc.getNombre()));
                    ((AbstractTableModel)tablaFactores.getModel()).fireTableDataChanged();
                    ((AbstractTableModel)tablaMonedas.getModel()).fireTableDataChanged();
                }
            } catch (LogicaExcepcion e1) {
                e1.printStackTrace();
                JOptionPane.showMessageDialog( this,"Error: "+ e1,"Mensaje",JOptionPane.OK_CANCEL_OPTION );
            } catch (java.util.NoSuchElementException e1) {
                e1.printStackTrace();
                JOptionPane.showMessageDialog( this, e1.getMessage(),"Mensaje",JOptionPane.OK_CANCEL_OPTION );
            } catch (Exception e1) {
                e1.printStackTrace();
                JOptionPane.showMessageDialog( this,"Error: "+ e1,"Mensaje",JOptionPane.OK_CANCEL_OPTION );
            }
//                        throw new java.util.NoSuchElementException("La matriz "+matriz.getNombre()+" no tiene factores asociados");
    }
    PantallaAsociacionFactorContrato pantallaAsociacionFactoresContratos=null;
    public void setPantallaAsociacionFactoresContratos(PantallaAsociacionFactorContrato pantallaAsociacionFactoresContratos){
        this.pantallaAsociacionFactoresContratos=pantallaAsociacionFactoresContratos;
    }
    public Hashtable getRelacionFactores(){
        return ((ModeloTablaPAFM)tablaFactores.getModel()).getRelacionFactores();
    }
    
    public Hashtable getRelacionMonedasFactores(){
        return ((ModeloTablaPAFM)tablaMonedas.getModel()).getRelacionFactores();
    }
    
    public void setRelacionFactores(){
        tableChanged(null);
    }

    private List keyAdd = new ArrayList();
    public List getKeyAdd(){
        return keyAdd;
    }

    public void setKeyAdd(List list){
        this.keyAdd = list;
    }

    private void equalsToCopy(Hashtable htfuente,Hashtable htdestino,String quien){
        //        Double g=5.0;
        //        g.intValue();
        Enumeration enumeration=htfuente.keys();
        Hashtable httmp=new Hashtable();
        while(enumeration.hasMoreElements()){
            Object key=enumeration.nextElement();
            if(!htdestino.containsKey(key)){
                if(object==null)
                    httmp.put(key,htfuente.get(key));
                else if(object!=null && object.length>0){
                    for (int i = 0; i < object.length; i++){
                        if(object[i][0].equals(key) && ((Boolean)object[i][2])){
                            keyAdd.add(key.toString());
                            htdestino.put(key,htfuente.get(key));
                            break;
                        }
                    }
                }
            }
        }
        if(httmp.size()>0){
            object=null;
            new DAdicionarEspecies(getFrame(),httmp,this,quien);
            if(this.object.length>0){
                //keyAdd = new ArrayList();
                equalsToCopy(htfuente,htdestino,quien);
            }
        }
        object=null;
    }
    
    
    public void setRelacionMonedasFactores(Hashtable relacion){
        if(relacion.size()>0){
            equalsToCopy(this.relacionMonedasFactores, (Hashtable) relacion,"Monedas");
            ((ModeloTablaPAFM)tablaMonedas.getModel()).setRelacionFactores(relacion);
        }
    }
    
    public MatrizCorrelacionPK getComboMatricesPKSeleccion(){
        return (MatrizCorrelacionPK)comboMatricesPK.getSelectedItem();
    }
    
    public void setComboMatricesPKSeleccion(MatrizCorrelacionPK pk){
        if(pk!=null){
            ActionListener[] escuchas = comboMatricesPK.getActionListeners();
            for (int i=0; i<escuchas.length; i++)
                comboMatricesPK.removeActionListener( escuchas[i] );
            
            comboMatricesPK.setSelectedItem(pk);
            
            for (int i=0; i<escuchas.length; i++)
                comboMatricesPK.addActionListener( escuchas[i] );
        }
    }
    
    public void salir() throws Exception {
        this.origenMonedasValores.closePoolConnection();
    }
    
    Integer getIdMatriz() {
        return idMatriz;
    }
    
    Integer idMatriz=null;
    void setSelectIdMatriz(Integer i) {
        this.idMatriz=i;
    }
    
    private Object[][] object=null;
    void setDataUpdate(Object[][] object) {
        this.object=object;
    }
    private ejb.metrica.matriz.correlacion.MatrizCorrelacionSBRemote lookupMatrizCorrelacionSBBean() {
        try {
            Properties prop = new Properties();
            prop.put( Context.INITIAL_CONTEXT_FACTORY, IGBean.INITIAL_CONTEXT_FACTORY);
            String Sockec = new ConexionServer().getSocketServer();
            prop.put( Context.PROVIDER_URL, Sockec);
            
            javax.naming.Context c = new javax.naming.InitialContext(prop);
            Object remote = c.lookup("MatrizCorrelacionSBBean");
            ejb.metrica.matriz.correlacion.MatrizCorrelacionSBRemoteHome rv = (ejb.metrica.matriz.correlacion.MatrizCorrelacionSBRemoteHome) javax.rmi.PortableRemoteObject.narrow(remote, ejb.metrica.matriz.correlacion.MatrizCorrelacionSBRemoteHome.class);
            return rv.create();
        } catch(javax.naming.NamingException ne) {
//            java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE,"exception caught" ,ne);
            throw new RuntimeException(ne);
        } catch(javax.ejb.CreateException ce) {
//            java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE,"exception caught" ,ce);
            throw new RuntimeException(ce);
        } catch(java.rmi.RemoteException re) {
//            java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE,"exception caught" ,re);
            throw new RuntimeException(re);
        }
    }

}


